import os
from concurrent.futures import ThreadPoolExecutor
from PIL import Image

# 定义目标文件大小范围
MIN_SIZE = 10 * 1024  # 10KB
MAX_SIZE = 200 * 1024  # 200KB


# 定义调整图片大小的函数
def adjust_image_size(file_path):
    try:
        # 获取当前文件大小
        current_size = os.path.getsize(file_path)

        # 如果文件大小为0KB，输出文件名并跳过处理
        if current_size == 0:
            print(f"文件大小为0KB: {file_path}")
            return

        # 如果文件大小在目标范围内，不做处理
        if MIN_SIZE < current_size <= MAX_SIZE:
            print(f"{file_path} 文件大小在目标范围内，无需调整。")
            return

        # 打开图片
        img = Image.open(file_path)

        # 如果图片是RGBA模式，转换为RGB模式
        if img.mode == 'RGBA':
            img = img.convert('RGB')

        # 如果文件大小小于或等于10KB，增大文件大小
        if current_size <= MIN_SIZE:
            # 计算需要增加的像素数
            scale_factor = (MIN_SIZE / current_size) ** 0.5 + 1  # 增加额外的缩放比例
            new_width = int(img.width * scale_factor)
            new_height = int(img.height * scale_factor)
            img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)

            # 保存调整后的图片，覆盖原文件
            img.save(file_path, quality=95)
            new_size = os.path.getsize(file_path)

            # 如果调整后仍然小于或等于10KB，继续增加尺寸
            while new_size <= MIN_SIZE:
                scale_factor *= 1.2  # 进一步增加缩放比例
                new_width = int(img.width * scale_factor)
                new_height = int(img.height * scale_factor)
                img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
                img.save(file_path, quality=95)
                new_size = os.path.getsize(file_path)

            print(f"{file_path} 文件大小已调整。")
            return

        # 如果文件大小大于200KB，减小文件大小
        elif current_size > MAX_SIZE:
            # 计算需要减少的像素数
            scale_factor = (MAX_SIZE / current_size) ** 0.5
            new_width = int(img.width * scale_factor)
            new_height = int(img.height * scale_factor)
            img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)

            quality = 85
            # 保存临时文件，保留原始文件扩展名
            file_name, file_extension = os.path.splitext(file_path)
            temp_path = file_name + "_temp" + file_extension
            img.save(temp_path, quality=quality)
            temp_size = os.path.getsize(temp_path)

            # 如果仍然大于MAX_SIZE，继续降低质量
            while temp_size > MAX_SIZE and quality > 10:
                quality = max(quality - 10, 10)
                img.save(temp_path, quality=quality)
                temp_size = os.path.getsize(temp_path)

            # 覆盖原文件
            os.replace(temp_path, file_path)
            print(f"{file_path} 文件大小已调整。")
            return

    except Exception as e:
        print(f"处理 {file_path} 时出错: {e}")


# 定义遍历目录并处理文件的函数
def process_directory(directory):
    # 获取目录下所有文件
    files = [os.path.join(directory, f) for f in os.listdir(directory)
             if os.path.isfile(os.path.join(directory, f))]

    # 使用线程池处理文件
    with ThreadPoolExecutor(max_workers=4) as executor:
        executor.map(adjust_image_size, files)


# 主函数
if __name__ == "__main__":
    # 指定目录
    directory = r"C:\Users\SiNian\Desktop\测试人脸照片"

    # 处理目录下的文件
    process_directory(directory)
    print("所有文件处理完成。")